package edu.nf.ch06.container.my;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * @author CSY
 * @date 2025 - 04 - 15
 */
public class ContainerFactory {
    private static<T> Map<String,T> manage(){
        // 获取test目录 - 相对路径
        File file = new File("ch06/src/main/java/edu/nf/ch06");

        //获取到目录中的所有文件和子目录
        File[] files = file.listFiles();

        //一个map集合用于存储实例化的对象
        Map<String,T> map = new HashMap<String,T>();
        for (File f : files) {
            //检查是否是目录
            if (f.isDirectory()) {
                //如果是目录就获取到目录中的所有文件和牡蛎
                File[] sonFiles = f.listFiles();
                //循环遍历
                for (File sonFile : sonFiles) {
                    //判断是不是java文件
                    if (sonFile.isFile() && sonFile.getName().endsWith(".java")) {
                        //获取绝对路径
                        String absolutePath = sonFile.getAbsolutePath();
                        //获取到对象所处包名
                        int start = absolutePath.indexOf("java");
                        int end = absolutePath.lastIndexOf(".");
                        absolutePath = absolutePath.substring(start+5,end).replace("\\",".");
                        try {
                            //根据得到的包名获取calss对象
                            Class<?> clazz = Class.forName(absolutePath);
                            //判断是否有Component注解
                            if (clazz.isAnnotationPresent(Component.class)) {
                                //获取到类名并全部小写
                                String value = clazz.getSimpleName().toLowerCase();
                                //实例化对象
                                Object o = clazz.getConstructor().newInstance();
                                //添加到map集合中
                                map.put(value,(T)o);
                            }
                        } catch (Exception e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        }
        //返回
        return map;
    }

    public static<T> T getBean(String name){
        //根据自定义的方法获取到map集合
        Map<String, T> manage = manage();
        if(manage.containsKey(name.toLowerCase())){
            return manage.get(name.toLowerCase());
        }
        throw new RuntimeException("匹配失败，不存在"+name+"类");

    }
}
